package com.itany.corejava.code07_面向对象.多态;

/**
 * @author: 石小俊
 * @date: 2023年03月08日 9:29
 * @version: 1.0
 */
public class Person {
    private String name;
    private int age;
    private String personId;

    public void show(){
        System.out.println("姓名:"+name+",年龄:"+age+",身份证号码:"+personId);
    }

    public Person() {
    }

    public Person(String name, int age, String personId) {
        this.name = name;
        this.age = age;
        this.personId = personId;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPersonId() {
        return personId;
    }

    public void setPersonId(String personId) {
        this.personId = personId;
    }
}
class Man extends Person {
    private double salary;


    public Man(String name, int age, String personId, double salary) {
        super(name, age, personId);
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public void show() {
        System.out.println("我是一个男人,姓名:"+super.getName()+",年龄:"+getAge()+",身份证号码:"+getPersonId()+",工资:"+salary);
    }

    public void work(){
        System.out.println("我是一个男人,我需要赚钱养家,我每个月能赚"+salary+"元");
    }
}
class WoMan extends Person {

    // 颜值,取值范围:0-100
    private int appearance;

    public int getAppearance() {
        return appearance;
    }

    public void setAppearance(int appearance) {
        this.appearance = appearance;
    }

    @Override
    public void show() {
        System.out.println("我是一个女人,姓名:"+super.getName()+",年龄:"+getAge()+",身份证号码:"+getPersonId()+"颜值:"+appearance);
    }

    public void shopping(){
        System.out.println("我是一个女人,我的颜值可以达到"+appearance+"分,负责貌美如花,没事逛逛街,购购物");
    }
}
class TestPerson{
    public static void main(String[] args) {
        // 对象的多态性,父类Person的引用指向了子类Man的对象
        // Person为编译时类型,Man为运行时类型
        // 此时Person为Man的父类
        // 这种情况称之为向上转型,会进行自动类型转换
        Person person = new Man("admin",25,"321234200001021234",8000.0);
        // 此时查看person,其打印结果是个Man对象
        System.out.println(person);
        // 调用父类方法,执行的是子类重写后的方法
        person.show();
        // 由于此时的对象指向的是父类Person
        // 因此,该对象只能调用父类中存在的方法
        // 无法直接调用子类方法,除非转成子类
        // person.work(); // 报错
        // 此时可以通过强制类型转换的方式进行子类方法的调用
        // ((Man)person).work();
        System.out.println("********************向下转型********************");
        if(person instanceof Man){
            Man man = (Man) person;
            man.work();
        } else{
            System.out.println("person无法转换成Man");
        }
        // 如果直接进行强制类型转换,存在转换失败的风险
        if(person instanceof WoMan){
            WoMan woMan = (WoMan) person;
            woMan.shopping();
        } else{
            System.out.println("person无法转换成WoMan");
        }
    }
}
